﻿#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

//struct Student {
//    int id;
//    char name[20];
//    float score;
//};
//
//int main()
//{
//    struct Student stu1 = { 20253265,"zhangsan",58.8 };
//    struct Student* ps = &stu1;
//
//    printf("%d\n", ps->id);
//    printf("%s\n", ps->name);
//    printf("%d\n", ps->score);
//
//    return 0;
//}



//struct S1 {
//	char c1;
//	char c2;
//	int i;
//};
//
//struct S2 {
//	char c1;
//	int i;
//	char c2;
//}s2;
//
//struct S3
//{
//	char c1;
//	struct S2 s2;
//	double d;
//};
//
//
//int main()
//{
//	printf("%d\n", sizeof(struct S3));
//	return 0;
//}

////例如：
//struct S1//8
//{
//	char c1;
//	int i;
//	char c2;
//};
//
//struct S2//12
//{
//	char c1;
//	char c2;
//	int i;
//};



//#pragma pack(1)//设置默认对⻬数为1
//
//struct S
//{
//	char c1;
//	int i;
//	char c2;
//};
//#pragma pack()//取消设置的对⻬数，还原为默认
//
//int main()
//{
//	printf("%d\n", sizeof(struct S));
//	return 0;
//}

//struct S
//{
//	int data[1000];
//	int num;
//};
//
//struct S s = { {1,2,3,4}, 1000 };
//
////结构体传参
//void print1(struct S s)
//{
//	printf("%d\n", s.num);
//}
//
////结构体地址传参
//void print2(struct S* ps)
//{
//	printf("%d\n", ps->num);
//}
//
//int main()
//{
//	print1(s); //传结构体
//	print2(&s); //传地址
//	return 0;
//}


//struct A
//{
//	int _a : 2;//代表该变量在内存空间中仅占2个bit位
//	int _b : 5;//代表该变量在内存空间中仅占5个bit位
//	int _c : 10;//代表该变量在内存空间中仅占10个bit位
//	int _d : 30;//代表该变量在内存空间中仅占30个bit位
//};


//struct S
//{
//	char a : 3;
//	char b : 4;
//	char c : 5;
//	char d : 4;
//};
//
//int main()
//{
//	struct S s = { 0 };
//	s.a = 10;
//	s.b = 12;
//	s.c = 3;
//	s.d = 4;
//	return 0;
//}


//struct A
//{
//	int _a : 2;
//	int _b : 5;
//	int _c : 10;
//	int _d : 30;
//};
//int main()
//{
//	struct A sa = { 0 };
//	scanf("%d", &sa._b);//这是错误的
//
//	//正确的⽰范
//	int b = 0;
//	scanf("%d", &b);
//	sa._b = b;
//	return 0;
//}

#include <stdio.h>


//int Bubble_sort1(int* arr, int sz)
//{
//    int flag;
//    int count = 0;
//    for (int i = 0; i < sz - 1; i++)
//    {
//        flag = 1;
//        for (int j = 0; j < sz - i - 1; j++)
//        {
//            count++;
//            if (arr[j] > arr[j + 1])
//            {
//                flag = 0;
//                int temp = arr[j];
//                arr[j] = arr[j + 1];
//                arr[j + 1] = temp;
//            }
//        }
//        if (flag == 1)
//            break;
//    }
//    return count;
//}
//
//int Bubble_sort2(int* arr, int sz)
//{
//    int count = 0;
//    for (int i = 0; i < sz - 1; i++)
//    {
//        for (int j = 0; j < sz - i - 1; j++)
//        {
//            count++;
//            if (arr[j] > arr[j + 1])
//            {
//                int temp = arr[j];
//                arr[j] = arr[j + 1];
//                arr[j + 1] = temp;
//            }
//        }
//    }
//    return count;
//}
//
//int main()
//{
//    int arr1[] = { 1, 2, 3, 4, 5, 7, 6, 8, 9, 10 };
//    int sz = sizeof(arr1) / sizeof(arr1[0]);
//
//    int arr2[10];
//    for (int i = 0; i < sz; i++) {
//        arr2[i] = arr1[i];
//    }
//
//    int count1 = Bubble_sort1(arr1, sz);
//    int count2 = Bubble_sort2(arr2, sz);
//
//    printf("Bubble_sort1的交换次数: %d\n", count1);
//    printf("Bubble_sort2的交换次数: %d\n", count2);
//
//    return 0;
//}


//struct Student {
//	char name[10];
//	int age;
//};
//
//int compare_name(const void* p1, const void* p2)
//{
//	return strcmp(((struct Student*)p1)->name, ((struct Student*)p2)->name);
//}
//
//int compare_age(const void* p1, const void* p2)
//{
//	return ((struct Student*)p1)->age - ((struct Student*)p2)->age;
//}
//
//int main()
//{
//	struct Student stu[4] = { {"lisa",18},{"peter",20},{"kate",15},{"jane",25} };
//	size_t sz = sizeof(stu) / sizeof(stu[0]);
//	//qsort(stu, sz, sizeof(stu[0]), compare_name);//按照name排序
//	qsort(stu, sz, sizeof(stu[0]), compare_age);//按照age排序
//
//
//	for (int i = 0; i < sz; i++)
//	{
//		printf("%s ", stu[i].name);
//	}
//
//	printf("\n");
//
//	for (int i = 0; i < sz; i++)
//	{
//		printf("%d ", stu[i].age);
//	}
//	return 0;
//}

int compare(const void* p1, const void* p2)
{
	return (*(int*)p1 - *(int*)p2);//将p1,p2转换为整型指针，解引用后读取四个字节，就是原来数组的值
}

void Swap(void* p1, void* p2, size_t size)
{
	for (int i = 0; i < size; i++)//逐一交换每一个字节的内容，循环四次，交换整型变量
	{
		char temp = *((char*)p1 + i);
		*((char*)p1 + i) = *((char*)p2 + i);
		*((char*)p2 + i) = temp;
	}
}

void Bubble(void* arr, size_t sz, size_t size, int (*compare)(const void*, const void*))
{
	for (int i = 0; i < sz - 1; i++)
	{
		for (int j = 0; j < sz - i - 1; j++)
		{
			if (compare((char*)arr + j * size, (char*)arr + (j + 1) * size) > 0)//调用比较函数
			{
				Swap((char*)arr + j * size, (char*)arr + (j + 1) * size, size);
			}
		}
	}
}

int main()
{
	int arr[10] = { 1,5,33,4,2,6,9,8,99,100 };
	size_t sz = sizeof(arr) / sizeof(arr[0]);
	Bubble(arr, sz, sizeof(arr[0]), compare);//模仿qsort函数

	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}